#include "verifycodewidget.h"
#include "model/data.h"
#include <QPainter>


VerifyCodeWidget::VerifyCodeWidget(QWidget *parent)
    : QWidget(parent), randomGenerator(model::getTime())
{
    verifyCode = generateVerifyCode();
}

QString VerifyCodeWidget::generateVerifyCode(){
    const QString chars = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789"; // 无混淆字符
    QString code;
    for (int i = 0; i < 4; ++i) {
        int index = randomGenerator.generate() % chars.length();
        code += chars.at(index);
        // code += chars.at(rg->bounded(chars.size()));
    }
    return code;
}

void VerifyCodeWidget::refreshVerifyCode(){
    verifyCode = generateVerifyCode();
    // 通过 update 就可以起到 "刷新界面" , 本身就是触发 paintEvent
    this->update();
}

bool VerifyCodeWidget::checkVerifyCode(const QString &input) const{
    // 此处比较忽略大小写
    return verifyCode.compare(input, Qt::CaseInsensitive) == 0;
}

void VerifyCodeWidget::paintEvent(QPaintEvent *event) {
    (void)event;
    const int w = this->width(); // 使用实际控件的宽度
    const int h = this->height(); // 使用实际控件的高度

    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing, true); // 开启抗锯齿，使字体更平滑

    // 1. 绘制验证码
    QFont font("Consolas", 20, QFont::Bold); // 推荐使用等宽字体
    painter.setFont(font);

    // 绘制每个字符
    for (int i = 0; i < verifyCode.size(); ++i) {
        // 设置随机颜色
        painter.setPen(QColor(randomGenerator.generate() % 200, randomGenerator.generate() % 200, randomGenerator.generate() % 200));

        // 计算字符位置和旋转角度
        int x = w / 4 * i + randomGenerator.generate() % 5 + 5;
        int y = h / 2 + randomGenerator.generate() % 10;
        int angle = randomGenerator.generate() % 40 - 20; // 随机旋转 -20到20度

        painter.save(); // 保存当前状态
        painter.translate(x, y); // 移动到绘制位置
        painter.rotate(angle); // 旋转
        painter.drawText(0, 0, QString(verifyCode[i]));
        painter.restore(); // 恢复之前保存的状态
    }

    // 2. 绘制噪点和噪线
    // 绘制噪点: 添加随机噪点
    for(int i = 0; i < 100; i++) {
        painter.setPen(QColor(randomGenerator.generate() % 256, randomGenerator.generate() % 256, randomGenerator.generate() % 256));
        painter.drawPoint(randomGenerator.generate() % w, randomGenerator.generate() % h);
    }
    // 绘制噪线: 添加随机干扰线
    for(int i = 0; i < 5; i++) {
        painter.setPen(QColor(randomGenerator.generate() % 256, randomGenerator.generate() % 256, randomGenerator.generate() % 256));
        painter.drawLine(randomGenerator.generate() % w, randomGenerator.generate() % h,
                         randomGenerator.generate() % w, randomGenerator.generate() % h);
    }
}

// void VerifyCodeWidget::paintEvent(QPaintEvent *event){
//     (void) event;
//     const int w = 180, h = 40;

//     // 画笔
//     QPainter painter(this);
//     QPen pen;
//     QFont font("楷体", 16, QFont::Bold, true);
//     painter.setFont(font);

//     // 画点: 添加随机噪点
//     for(int i = 0; i < 100; i++)
//     {
//         pen = QPen(QColor(randomGenerator.generate() % 256, randomGenerator.generate() % 256, randomGenerator.generate() % 256));
//         painter.setPen(pen);
//         painter.drawPoint(randomGenerator.generate() % w, randomGenerator.generate() % h);
//     }

//     // 画线: 添加随机干扰线
//     for(int i = 0; i < 5; i++)
//     {
//         pen = QPen(QColor(randomGenerator.generate() % 256, randomGenerator.generate() % 256, randomGenerator.generate() % 256));
//         painter.setPen(pen);
//         painter.drawLine(randomGenerator.generate() % w, randomGenerator.generate() % h,
//                          randomGenerator.generate() % w, randomGenerator.generate() % h);
//     }

//     // 绘制验证码
//     for(int i = 0; i < verifyCode.size(); i++)
//     {
//         pen = QPen(QColor(randomGenerator.generate() % 255, randomGenerator.generate() % 255, randomGenerator.generate() % 255));
//         painter.setPen(pen);
//         painter.drawText(5+20*i, randomGenerator.generate() % 10, 30, 30, Qt::AlignCenter, QString(verifyCode[i]));
//     }
// }

void VerifyCodeWidget::mousePressEvent(QMouseEvent *event){
    (void) event;
    this->refreshVerifyCode();
}












